import { app, BrowserWindow, Menu, screen } from "electron";
import { createWindow } from "@/utils/new_win/index.js";
import { Events } from "@/utils/events_bus";
import { express_app, port } from "@/utils/proxy";
import { init } from "@/data_base/init.js";
import { ensureSaltExists } from "@/utils/encryption/index.js";

// 存放窗口的对象
// key: 窗口名称
// value: 窗口对象
const win_dict = {};
/**
 * 创建窗口
 * @param { Object } config.options 窗口配置,窗口的宽高配置可以为"auto",当宽高为auto时，窗口宽度为当前屏幕的宽度，高度为当前屏幕的高度
 * @param { Object } config.path 窗口路径
 * @param { string } config.name 窗口名称，当你需要向某一个窗口发消息时，需要使用这个名称
 */
const create = config => {
	const primaryDisplay = screen.getPrimaryDisplay();
	let {
		options = {},
		path = "/",
		name = "main",
		title = "工具集",
		is_external_page = false,
		src = "www.baidu.com",
	} = config;
	if (options.width === "auto") {
		options.width = primaryDisplay.workAreaSize.width;
	}
	if (options.height === "auto") {
		options.height = primaryDisplay.workAreaSize.height;
	}
	if (win_dict[name] && !is_external_page) {
		throw new Error(`Window ${name} already exists!`);
	}
	// 创建主窗口
	console.log(options, path, title, is_external_page, src);
	const win = createWindow(options, path, title, is_external_page, src);
	win.win.on('close', (e) => {
        // 从 win_dict 中移除该窗口
        if (win_dict[name]) {
            delete win_dict[name];
        }
    });
	// 将主窗口放入 win_dict 中
	win_dict[name] = win.win;
};

// 当所有窗口都关闭时触发
// app.on("window-all-closed", () => {
//   // 在 macOS 上，应用程序通常不会退出，而是保持活动状态
//   if (process.platform !== "darwin") {
//     app.quit(); // 退出应用程序
//   }
// });

// 当应用程序被激活时触发（例如点击 Dock 图标）
app.on("activate", () => {
	// 如果没有打开的窗口，则创建一个新窗口
	if (BrowserWindow.getAllWindows().length === 0) {
		// 创建主窗口
		create({
			options: {
				width: 1600,
				height: 900,
			},
		});
	}
});
app.commandLine.appendSwitch("lang", "zh-CN");
// 当应用程序准备就绪时执行
app.whenReady().then(() => {
	// 移除默认的应用程序菜单
	Menu.setApplicationMenu(null);
	// 创建主窗口
	create({
		options: {
			width: 1600,
			height: 900,
		},
	});
	// 启动代理服务器
	express_app.listen(port, () => {
		console.log(`Proxy server is running on http://localhost:${port}`);
	});
	// 初始化数据库方法
	init();
	// 存储加密算法的盐
	ensureSaltExists();
});


// 开发环境下的特殊处理
if (process.env.NODE_ENV !== "production") {
	// Windows 平台：监听父进程发送的退出消息
	if (process.platform === "win32") {
		process.on("message", data => {
			if (data === "graceful-exit") {
				app.quit(); // 优雅退出
			}
		});
	} else {
		// 其他平台：监听 SIGTERM 信号
		process.on("SIGTERM", () => {
			app.quit(); // 退出应用程序
		});
	}
}

// 处理最小化窗口
Events.IPC.Main.on("minimize-window", e => {
	const window = BrowserWindow.fromWebContents(e.sender);
	window.minimize();
});

// 处理最大化/还原窗口
Events.IPC.Main.on("maximize-window", e => {
	const window = BrowserWindow.fromWebContents(e.sender);
	if (window.isMaximized()) {
		window.unmaximize();
	} else {
		window.maximize();
	}
});

// 处理关闭窗口
Events.IPC.Main.on("close-window", e => {
	// const window = BrowserWindow.fromWebContents(e.sender);
	if (e.sender === win_dict["main"].webContents) {
		app.quit();
		return;
	}
	for (let key in win_dict) {
		// 遍历 win_dict 对象的所有属性
		if (
			win_dict[key] &&
			win_dict[key].webContents === e.sender &&
			!win_dict[key].isDestroyed()
		) {
			if (win_dict[key]) {
                win_dict[key].close();
            }
			delete win_dict[key]
			return;
		}
	}
});

// 打开窗口
Events.IPC.Main.on("open_new", (e, options) => {
	create(options);
});

Events.init(win_dict);
